package com.tools.web.interceptor.auth;

import com.tools.common.object.Note;
import com.tools.common.thread.Timeunit;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户认证管理器接口
 * */
@Note("用户认证管理器接口")
public interface AuthenticationManager extends HandlerInterceptor {

    @Note("封装好的 AuthUser 对象存储在 attribute 里的名称")
    String USER_DATA_NAME = "authUser";

    @Note("从请求参数中获取设备类型 ID")
    static String getDeviceTypeFromParam(HttpServletRequest request, LoginDeviceTypeEnum defaultValue) {
        String deviceTypeId = request.getParameter("deviceTypeId");
        return (deviceTypeId != null) ? deviceTypeId : defaultValue.getId();
    }

    @Note("从请求头中获取设备类型 ID")
    static String getDeviceTypeFromHeader(HttpServletRequest request, LoginDeviceTypeEnum defaultValue) {
        String deviceTypeId = request.getHeader("dt");
        return (deviceTypeId != null) ? deviceTypeId : defaultValue.getId();
    }

    @Note("获取用户认证对象的服务接口实例")
    AuthUserService getAuthUserService();

    @Note("登录后续的认证流程")
    void handleLogin(Object userId, String userType, Object user, long expiration,
                     Timeunit timeunit, HttpServletResponse response, String deviceTypeId);

    @Note("封禁用户操作")
    void handleDisable(HttpServletRequest request);

    @Note("退出登录的操作")
    void handleLoginOut(HttpServletRequest request);

    @Note("更新 “用户数据/角色/权限/路由/自定义数据” 等操作时的后续同步更新操作")
    void handleUpdate(Object userId, String userType);

    @Note("更新 “用户数据/角色/权限/路由/自定义数据” 等操作时的后续同步更新操作")
    void handleUpdate(AuthUser newAuthUser);
}
